package compilador.semantico.comando;

import compilador.Command;
import compilador.CommandException;
import compilador.semantico.Atributo;
import compilador.semantico.GerenciadorDeContexto;
import compilador.semantico.SemanticException;
import compilador.semantico.TabelaSemantica;
import compilador.semantico.Tipo;

public class DeclaraVarCommand implements Command {

	@Override
	public void run(String... args) throws CommandException {
		String[] names = args[0].split(",");
		String type = args[1];
		GerenciadorDeContexto pilha = GerenciadorDeContexto.getInstance();
		TabelaSemantica tabela = TabelaSemantica.getInstance();

		if (type.equals("nondecl")) {
			type = pilha.top().getTipo();
		} else {
			if (!tabela.ehPrimitivo(type) && !tabela.containsTipo(type)) {
				throw new SemanticException("Tipo " + type + " nao reconhecido.");
			}
		}

		for (String name : names) {
			// verifica se ja existe tmp declarada com o nome
			// ou no contexto atual ja possui variavel com o nome
			Tipo ctx = pilha.getDefaultContext();
			if ( tabela.containsTemp(name) || ctx.getFilho(name) != null ) {
				throw new SemanticException("Ja existe uma variavel com o nome dado: " + name);
			}
			Atributo att = new Atributo(name, type);
			tabela.addAtributo(att);
		}
//		pilha.remove();
	}

}
